// AlarmaDLL.cpp
// compile with: /EHsc /LD


/**
* /brief DLL toiminnallisuudet
* Monet "ratkaisut" voivat olla kyseenalaisia, koska minulla ei ole viela C++ kurssia suoritettuna
* ja en ole ikina yksin mitaan nain laaja tehnyt.
* Kiitos ja anteeksi
* @author Niko Salonen
* @version 0.02 Mystic Mango
*/


#include "AlarmaDLL.h"
#include <stdexcept>
#include <iostream>
#include <Windows.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string>
#include <conio.h>
#include "C:\Program Files (x86)\FMOD SoundSystem\FMOD Programmers API Win32\api\inc\fmod.hpp"
#include <fmod_errors.h>
#pragma comment(lib, "fmodex_vc.lib")


FMOD::System     *systeemi;
FMOD::Sound      *sound1;
FMOD::Channel    *channel = 0;





using namespace std;

namespace AlarmaFuncs
{
	char *filu = "C:\default.mp3";
	char aikaStr[9];
	char pvmStr[9];
	char alarmaAika[9];

	char temp[1];
	int aikaInt[3];
	int alarmaInt[3];

	COORD Position;






/**
* intro() tulostaa menun ja odottaa kayttajalta valintaa.
* @return palauttaa kayttajan vilinnan.
*/

	int Wakeup::intro(int valinta)
	{
		system("CLS");
		cout << "\n\tALARMA!\n";
		cout << "\t\t1 = Tarkasta nykyinen aika\n";
		cout << "\t\t2 = Tarkasta pvm\n";
		cout << "\t\t3 = Aseta ALARMA!\n";
		cout << "\t\t4 = Lopetus\n";
		cout << "\n\t>> ";
		cin >> valinta;
		return valinta;
	}
/**
* menu() saa parametrina kayttajan valinnan ja 
* switchilla maarittelee jatkotoimenpiteet.
*/
	void Wakeup::menu(int valinta)
	{
		switch(valinta)
		{
		case 1:
			Wakeup::aika();
			break;
		case 2:
			Wakeup::pvm();
			break;
		case 3:
			Wakeup::alarma();
			break;
		case 4:
			Wakeup::loppu();
			break;
		default:
			cout << "\n\t\tHUONO VALINTA!\n";
		}
	}
/**
* loppu() lopettaa ohjelman
*/
	void Wakeup::loppu(){
		exit(0);
	}
/**
* aika() avulla voit katsoa koneesi sen hetkisen ajan.
*/
	void Wakeup::aika(){
		
		Wakeup::getAika();
		system("cls");
		cout << "\n\n\t\tKello on: " << aikaInt[0] << ":" << aikaInt[1] << ":" << aikaInt[2];
		cout << "\n\n\t\t";
		system("pause");
	}


/**
* pvm() avulla voit katsoa koneesi sen hetkisen paivamaaran.
*/
	void Wakeup::pvm(){
		
		_strdate_s(pvmStr);
		system("cls");
		cout << "\n\t\tTanaan on: " << pvmStr;
		cout << "\n\n\t\t";
		system("pause");
		
	}
/**
* alarma() funktiossa asetetaan itse halytys.
* halytys kirjataan muotoon 00:00:00 ja se pilkotaan sitten
* integereiksi.
*/
	void Wakeup::alarma(){

		_strdate_s(pvmStr);
		_strtime_s(aikaStr);
		system("cls");
		cout << "\n\t\tKello on: " << aikaStr;
		cout << "\n\t\tAseta halytys.\n\t";
		cout << "\n\t\t>>";
		cin >> alarmaAika;

		Wakeup::getAlarma();

		
		Wakeup::suorita();
	}

/**
* suorita() laittaa halytyksen kaytantoon.
* kun nykyinen aika tasmaa heratysajan kanssa kutsutaan soita()
*/
	void Wakeup::suorita(){
		bool haly = false;
		while(!haly)
		{
			
			Wakeup::getAika();
			system("cls");
			cout << "\n\t\tALARMA ON AKTIVOITU!\n\n";
			cout << "\t\tAika nyt\t: " << aikaInt[0] << ":" << aikaInt[1] << ":" << aikaInt[2] << "\n\n";
			cout << "\t\tALARMA laukeaa\t: " << alarmaInt[0] << ":" << alarmaInt[1] << ":" << alarmaInt[2] << "\n\n";

			if (aikaInt[0] == alarmaInt[0] && aikaInt[1] == alarmaInt[1] && aikaInt[2] == alarmaInt[2]){
				Wakeup::soita();
				haly = true;
			}
			Sleep(500);


		}
	}

/**
* soita() alkaa soittaa musiikkia kayttaen hyvakseen fmod aanikirjastoa.
*/
	void Wakeup::soita(){

		

		
		system("cls");
		system("COLOR 0A");
		cout << "\n\n\t\tWAKE UP! WAKE UP! WAKE UP!!!\n\n\t\t" << endl;
		
		FMOD::System_Create(&systeemi);
		systeemi->init(32, FMOD_INIT_NORMAL, 0);
		systeemi->createSound(filu, FMOD_HARDWARE, 0, &sound1);
		systeemi->playSound(FMOD_CHANNEL_FREE, sound1, false, &channel);
		cout << "\n\t\t";
		system("pause");
		exit(0);
	}
/**
* versio() tulostaa kayttajalle nykyisen version tiedot.
*/
	void Wakeup::versio(){
		system("cls");
		cout << "\n\t\tAlarma versio v0.02 build: Mystic Mango" << endl;
		cout << "\n\n\t\t";
		
		system("pause");
		

	}

/**
* getAika() muuntaa char arrayhyn tallennetun ajan int arrayksi
*/
	void Wakeup::getAika(){
		_strtime_s(aikaStr);
		
		temp[0] = aikaStr[0];
		temp[1] = aikaStr[1];
		aikaInt[0] = atoi(temp);

		temp[0] = aikaStr[3];
		temp[1] = aikaStr[4];
		aikaInt[1] = atoi(temp);

		temp[0] = aikaStr[6];
		temp[1] = aikaStr[7];
		aikaInt[2] = atoi(temp);
	}
/**
* getAlarma() muuntaa char arrayhyn tallennetun heratys ajan int arrayksi
*/
	void Wakeup::getAlarma(){
		

		temp[0] = alarmaAika[0];
		temp[1] = alarmaAika[1];
		alarmaInt[0] = atoi(temp);

		temp[0] = alarmaAika[3];
		temp[1] = alarmaAika[4];
		alarmaInt[1] = atoi(temp);

		temp[0] = alarmaAika[6];
		temp[1] = alarmaAika[7];
		alarmaInt[2] = atoi(temp);

	}
/**
* aalarma() saa arvonaan kaynnistysparamatrin -mk arvon ja
* asettaa heratyksen niin monen minuutin paahan.
*/
	void Wakeup::aalarma(int x){
		_strtime_s(alarmaAika);
		_strdate_s(pvmStr);
		Wakeup::getAika();
		Wakeup::getAlarma();

		system("cls");

		alarmaInt[1] += x;


		if(alarmaInt[1]>=60)
		{
			alarmaInt[1]-=60;
			++alarmaInt[0];
			
			if(alarmaInt[0]>23)
				{
					alarmaInt[0]-=24;	
				}
			}

		Wakeup::suorita();
	}
/**
* biisi() saa parametrinaan -mp3 kahvan mukana annetun polun vaihtoehtoiseen soittoaaneen
*/
	void Wakeup::biisi(char* biisi){
		
		filu = biisi;
		
		cout << "\n\n\t\tHalytys soitetaan tiedostosta: " << filu << "." << endl;
		cout << "\n\t\t";
		system("pause");
		

	}

	


		
};